; void lista_insertar_ordenado(nodo_lista_t **l, nodo_lista_t *n);

%include "macros/nodo_arbol_t.mac"
%include "macros/nodo_lista_t.mac"

%define ptr_ptr_lista [ebp + 8]
%define ptr_nodo [ebp + 12]

global lista_insertar_ordenado

section .text

lista_insertar_ordenado:
	push ebp
	mov ebp, esp
	push esi
	push edi
	push ebx
	
	; Obtenemos la cantidad de apariciones del nodo.
	mov ebx, ptr_nodo ; ebx = puntero a algo de tipo nodo_lista_t.
	mov eax, ebx
	mov ebx, [ebx + off_ptr_nodo_arbol_t_nl] ; ebx = ptr al nodo_arbol.
	mov ebx, [ebx + off_apariciones_na] ; ebx = #apariciones del nodo pasado por parametro.
	
	mov edi, ptr_ptr_lista ; edi = ptr a ptr de tipo nodo_lista_t.
	mov esi, [edi] ; esi = ptr de tipo nodo_lista_t.
	
ciclo:
	cmp esi, 0
	je insertar
	
	mov edx, [esi + off_ptr_nodo_arbol_t_nl] ; edx = ptr al arbol.
	mov edx, [edx + off_apariciones_na] ; edx = apariciones del nodo i.
	cmp ebx,edx
	jb insertar ; Si es menor tengo que agregarlo.
	lea edi,[esi + off_ptr_sig_nl]	; edi = al siguiente (sino muevo punteros y vuelvo al ciclo).
	mov esi,[esi + off_ptr_sig_nl]	; esi = al siguiente del siguiente.
	jmp  ciclo
	
insertar:
	mov [edi], eax
	mov [eax + off_ptr_sig_nl], esi
	
fin:
	pop ebx
	pop edi
	pop esi
	pop ebp
	ret
